package br.com.comanda.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import android.util.Log;
import br.com.comanda.enums.DatePattern;

/**
 * Classe utilitária para datas
 * 
 * @author thiago
 * @since 09/01/2013
 */
public final class DateUtils {

	public static final long MILISSEGUNDOS_DIA = 86400000;

	private DateUtils() {
		super();
	}

	public static String now(DatePattern pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern.pattern());
		return sdf.format(new Date());
	}

	public static String now(String pattern) {
		SimpleDateFormat sdf = new SimpleDateFormat(pattern);
		return sdf.format(new Date());
	}

	public static String nowMinus(long minutesInMillis) {
		Date date = new Date(System.currentTimeMillis() - minutesInMillis);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
	}

	/**
	 * Converte uma data para uma String
	 */
	public static String convert(Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat(
				DatePattern.DDMMYYYY.pattern());
		return sdf.format(date);
	}

	/**
	 * converte String em data
	 * 
	 * @param data
	 * @return
	 * @throws ParseException
	 */
	public static Date convertStringDate(String data) throws ParseException {
		SimpleDateFormat df = new SimpleDateFormat(
				DatePattern.DDMMYYYY.pattern());
		return df.parse(data);
	}

	/**
	 * Parse a string into date without throw exception
	 * 
	 * @param data
	 * @return
	 */
	public static Date stringDateOrNull(String data) {
		try {
			return convertStringDate(data);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * Verifica se uma string segue o formato de data
	 * 
	 * @param data
	 * @return
	 */
	public static boolean isDate(String data) {
		try {
			convertStringDate(data);
			return true;
		} catch (ParseException e) {
			return false;
		}
	}

	/**
	 * Retorna o numero de mili segundos de uma data a partir de 01/Janeiro/1970
	 */
	public static long getTimeMillisFromString(String date) {
		return stringDateOrNull(date).getTime();
	}

	/**
	 * quantidade de dias entre duas datas. Data 2 - data 1
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static int dayBetweenDates(Date date1, Date date2) {
		return (int) ((date2.getTime() - date1.getTime()) / MILISSEGUNDOS_DIA);
	}

	/**
	 * Retorna a data para ser usada SQL de sincronização. O formato de data
	 * deve ser igual ao do sybase.
	 */
	public static String dateToSynchronization(Date date) {
		if (date == null) {
			return null;
		}
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return sdf.format(date);
	}

	/**
	 * Converte a data do servidor do formato yyyy/MM/dd HH:mm:ss.mmm para long
	 */
	public static long castServerDate(String data) {
		try {
			if (StringUtils.hasLength(data)) {
				String dataSemMili = data.substring(0, data.indexOf("."));
				return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(
						dataSemMili).getTime();
			}
		} catch (ParseException e) {
			Log.e(Constantes.TAG_LOG,
					"Erro ao parsear data vinda do servidor: " + data, e);
		}

		return 0;
	}

	/**
	 * Converte a data no formato do servidor (yyyy-MM-dd HH:mm:ss) para o
	 * formato padrão (dd/MM/yyyy)
	 * 
	 * @author Alysson Myller
	 * @since 15/02/2012
	 */
	public static String castFromServerDateFormat(String data) {
		try {
			if (StringUtils.hasLength(data)) {
				return new SimpleDateFormat(DatePattern.DDMMYYYY.pattern())
						.format(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
								.parse(data));
			}
		} catch (ParseException e) {
			Log.e(Constantes.TAG_LOG,
					"Erro ao parsear data vinda do servidor: " + data, e);
		}
		return "";
	}

	/**
	 * @author Alysson Myller
	 * @since 25/04/2012
	 */
	public static CharSequence formatMessageDate(String dataMensagem) {
		try {
			if (StringUtils.hasLength(dataMensagem)) {
				return new SimpleDateFormat(DatePattern.DDMMYYYY.pattern())
						.format(new SimpleDateFormat("yyyy/MM/dd HH:mm")
								.parse(dataMensagem));
			}
		} catch (ParseException e) {
			Log.e(Constantes.TAG_LOG, "Erro ao formatar data da mensagem: "
					+ dataMensagem, e);
		}
		return "Erro";
	}

	/**
	 * @author Alysson Myller
	 * @since 02/05/2012
	 */
	public static String formatDebitoDate(String dataVencimento) {
		try {
			if (StringUtils.hasLength(dataVencimento)) {
				return new SimpleDateFormat(DatePattern.DDMMYYYY.pattern())
						.format(new SimpleDateFormat("yyyy/MM/dd")
								.parse(dataVencimento));
			}
		} catch (ParseException e) {
			Log.e(Constantes.TAG_LOG, "Erro ao formatar data da mensagem: "
					+ dataVencimento, e);
		}
		return "";
	}

	public static boolean isPassedDate(String date) {
		try {
			return DateUtils.convertStringDate(date).before(new Date());
		} catch (ParseException e) {
			return false;
		}
	}
}
